<?php
###############################################################################
#  Spip2Ning - plugin pour SPIP permetant de publier les articles dans Ning 
#  Copyright (C) 2009 StrangeBlackHole — Tous droits réservés.
#  
#  Ce programme est un logiciel libre ; vous pouvez le redistribuer ou le
#  modifier suivant les termes de la “GNU General Public License” telle que
#  publiée par la Free Software Foundation : soit la version 3 de cette
#  licence, soit (à votre gré) toute version ultérieure.
#  
#  Ce programme est distribué dans l’espoir qu’il vous sera utile, mais SANS
#  AUCUNE GARANTIE : sans même la garantie implicite de COMMERCIALISABILITÉ
#  ni d’ADÉQUATION À UN OBJECTIF PARTICULIER. Consultez la Licence Générale
#  Publique GNU pour plus de détails.
#  
#  Vous devriez avoir reçu une copie de la Licence Générale Publique GNU avec
#  ce programme ; si ce n’est pas le cas, consultez : http://www.gnu.org/licenses/
#
#  mail: contact@strangeblackhole.com
###############################################################################

if (!defined("_ECRIRE_INC_VERSION")) return;

include_spip("inc/filtres");

function Spip2Ning_notifications($flux) {

	$quoi          = $flux['args']['quoi'];
	$id            = intval($flux['args']['id']);
	$statut        = $flux['args']['options']['statut'];
	$statut_ancien = $flux['args']['options']['statut_ancien'];

	$billet = null;
	
	$ning = new ning();
	$ning->id_article = $id;
	$lang = sql_getfetsel("lang","spip_articles","id_article=" . $id );
	$domaine = lire_config("spip2ning/reseau");
	$ning->domaine = extraire_multi_lang($domaine, $lang);
	$ning->cookie = _DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES . $lang ."_spip2ning_cookies.txt";

	if( $ning->rubriques != "" ){

		$row = sql_fetsel("id_rubrique", "spip_articles", "id_article=" . $id );
		
		if( $ning->rubriques == $row["id_rubrique"] ){
			$flag = "OK";
		}else{
			$flag = "KO";
		}
		
	}else{
		$flag = "OK";
	}

	if( $quoi == 'instituerarticle' AND $flag == "OK" ) {
		switch ($statut) {
			case 'prepa':
				# code...
				break;
			
			case 'prop':
				# code...
				break;
				
			case 'poubelle':
				
				$row = sql_fetsel("nom_site", "spip_articles", "id_article=" . $id );
				if( $row["nom_site"] != ""){
					$pub = $ning->supprimer($row["nom_site"]);	
				}
				
				break;
			
			case 'publie':
				
				$retourligne = array("\n","\r");
				$laDate = sql_getfetsel("date","spip_articles","id_article=" . $id );
				$billet = array(
					"post_action" =>				 "publish",
					"post_add_comment_permission" => "all",
					"post_ampm"	=> 					 date("A",strtotime($laDate)),
					"post_body"	=> 					 str_replace($retourligne,"",trim(recuperer_fond("modeles/spip2ning_texte",array('id_article'=>$id)))),
					"post_day"	=> 					 date("j",strtotime($laDate)),
					"post_hour"	=> 					 date("g",strtotime($laDate)),
					"post_istext" => 				 "true",
					"post_min"	=> 					 date("i",strtotime($laDate)),
					"post_month"	=> 				 date("n",strtotime($laDate)),
					"post_privacy" =>				 "all",
					"post_title"	=> 				 trim(recuperer_fond("modeles/spip2ning_titre",array('id_article'=>$id))),
					"post_when"	=> 					 "now",
					"post_year"	=> 					 date("Y",strtotime($laDate)),
					"tags"	=>						 trim(recuperer_fond("modeles/spip2ning_tags",array('id_article'=>$id)))
					);
					
					spip_log("\n\n".str_replace($retourligne,"",trim(recuperer_fond("modeles/spip2ning_texte",array('id_article'=>$id))))."\n\n","spip2ning-billets");
					
					// on vérifie la présence de l'url du billet Ning
					$row = sql_fetsel("url_site", "spip_articles", "id_article=" . $id );
					
					// si l'url est pésente on fait une modification du billet. Sinon on crée le billet.
					if( $row["url_site"] != "") {
						$ning->url = $row["url_site"]."/update";
					}
					
					$pub = $ning->publier($billet);
					
				break;
				
			default:
				# code...
				break;
		}
	}

	return $flux;

}

// http://doc.spip.org/@extraire_multi
// Un grand merci à Marcimat pour cette fonction
function extraire_multi_lang ($letexte, $lang='') {
	if (strpos($letexte, '<multi>') === false) return $letexte; // perf
	if (preg_match_all(_EXTRAIRE_MULTI, $letexte, $regs, PREG_SET_ORDER))
		foreach ($regs as $reg) {
			$trads = extraire_trads($reg[1]);
			$trad = multi_trad($trads, $lang);
			$letexte = str_replace($reg[0], $trad , $letexte);
		}
	return $letexte;
}

/**
* 
*/
class ning
{
	public  $id_article;
	public  $rubriques;
	public  $url="";
	public  $domaine;
	private $identifiant;
	private $pass;
	private $userAgent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; fr; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4";
	public  $cookie;
	
	public function __construct()
	{
		$cfg			   = @unserialize($GLOBALS['meta']['spip2ning']);

		$this->identifiant = $cfg["user"];
		$this->motDePasse  = $cfg["pass"];
		$this->rubriques   = $cfg["rubriques"];
	}
	
	private function authentification()
	{

		$url  = $this->domaine . "/main/external/auth?format=serialize";
		
		spip_log("id_article=".$this->id_article." - ".$url,"spip2ning");
		
		$cles = array( "email" => $this->identifiant, "password" => $this->motDePasse );
				
		$curl = curl_init($url);

		curl_setopt($curl, CURLOPT_POST, true);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curl, CURLOPT_POSTFIELDS, $cles );
		curl_setopt($curl, CURLOPT_USERAGENT, $this->userAgent);
		curl_setopt($curl, CURLOPT_COOKIEJAR, $this->cookie);

		$result = curl_exec($curl);
		
		if($result === false) {
			
		    spip_log("Erreur Curl : " . curl_error($curl),"spip2ning");
			
			curl_close($curl);
		
			return NULL;
			
		}else{
			
			spip_log("id_article=". $this->id_article ." - ".$result,"spip2ning");
			
			curl_close($curl);
			
			return "NINGOK";
			
		}
	}
	
	public function publier($billet)
	{
		if ( !is_null($billet) ) {
				
				if( $this->authentification() == "NINGOK" ) {

					if( $this->url != "" ) {
						$url = $this->url;
					}else{
						$url = $this->domaine . "/profiles/blog/create";
					}

					$curl 	= curl_init($url);

					curl_setopt($curl, CURLOPT_POST, true);
					curl_setopt($curl, CURLOPT_HEADER, true);

					// la requète se solde par un redirection, on la suit
					curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

					curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
					curl_setopt($curl, CURLOPT_POSTFIELDS,	$billet);
					curl_setopt($curl, CURLOPT_USERAGENT, $this->userAgent);
					curl_setopt($curl, CURLOPT_COOKIEFILE, $this->cookie); 

					$result = curl_exec($curl);

					if($result === false) {

					    spip_log("Erreur Curl : " . curl_error($curl),"spip2ning");

						// Fermeture du gestionnaire
						curl_close($curl);

						return null;

					}else{

						// on retrouve l'id du billet de blog ning et on le stock dans "nom_site" de la table article.
						$doc = new DOMDocument();
						@$doc->loadHTML($result);
						$blogPostID = $doc->getElementById("deleteBlogPostLink");
						if(isset($blogPostID))
						{
							$blogPostID = $blogPostID->getAttribute('_url');
							$blogPostID = explode("?id=",$blogPostID);
							$blogPostID = trim($blogPostID[1]);
							@sql_updateq("spip_articles", array("nom_site"=>"$blogPostID"), "id_article=$this->id_article");
						}
						else
						{
							spip_log("L'ID du billet n'a pas été retourné","spip2ning");
						}
						// on retourne l'url du billet de blog retourné par NING
						$urlBilletNing = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL);
						// on stock l'url du billet NING en correspondance avec l'id de l'article SPIP
						@sql_updateq("spip_articles", array("url_site"=>"$urlBilletNing"), "id_article=$this->id_article");
						
						curl_close($curl);
						
						return true;

					}

				}		
		}
		
	}
	
	public function supprimer($blogPostID)
	{
		if( $this->authentification() == "NINGOK" ) {
			
			$url  = $this->domaine . "/profiles/blog/update?id=".$blogPostID;
			$cles = array( "post_action" => "delete", "xg_token" => "" );
			
			$curl = curl_init($url);

			curl_setopt($curl, CURLOPT_POST, true);
			curl_setopt($curl, CURLOPT_HEADER, true);

			// la requète se solde par un redirection, on la suit
			curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

			curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
			curl_setopt($curl, CURLOPT_POSTFIELDS,	$cles);
			curl_setopt($curl, CURLOPT_USERAGENT, $this->userAgent);
			curl_setopt($curl, CURLOPT_COOKIEFILE, $this->cookie);

			curl_exec($curl);

			curl_close($curl);

			return true;
		}

	}
}

?>